home *** CD-ROM | disk | FTP | other *** search
-
- #include "cips.h"
-
- #define FILL 150
-
- /*******************************************
- *
- * geometry(..
- *
- * This routine performs geometric
- * transformations on the pixels in an
- * image array. It performs basic
- * displacement, stretching, and rotation.
- *
- * The basic equations are:
- *
- * new x = x.cos(a) + y.sin(a) + x_displace
- * + x.x_stretch +x.y.x_cross
- *
- * new y = y.cos(a) - x.sin(a) + y_displace
- * + y.y_stretch +x.y.y_cross
- *
- *******************************************/
-
- geometry(in_name, out_name, the_image, out_image,
- il, ie, ll, le, x_angle,
- x_stretch, y_stretch,
- x_displace, y_displace,
- x_cross, y_cross,
- bilinear)
-
- char in_name[], out_name[];
- float x_angle, x_stretch, y_stretch,
- x_cross, y_cross;
- int bilinear, il, ie, ll, le;
- short the_image[ROWS][COLS],
- out_image[ROWS][COLS],
- x_displace, y_displace;
- {
- double cosa, sina, radian_angle, tmpx, tmpy;
- float fi, fj, x_div, y_div, x_num, y_num;
- int i, j, new_i, new_j;
- struct tiff_header_struct image_header;
-
- create_file_if_needed(in_name, out_name, out_image);
-
- read_tiff_image(in_name, the_image, il, ie, ll, le);
-
- /******************************
- *
- * Load the terms array with
- * the correct parameters.
- *
- *******************************/
-
- /* the following magic number is from
- 180 degrees divided by pi */
- radian_angle = x_angle/57.29577951;
- cosa = cos(radian_angle);
- sina = sin(radian_angle);
-
- /************************************
- *
- * NOTE: You divide by the
- * stretching factors. Therefore, if
- * they are zero, you divide by 1.
- * You do this with the x_div y_div
- * variables. You also need a
- * numerator term to create a zero
- * product. You do this with the
- * x_num and y_num variables.
- *
- *************************************/
-
- if(x_stretch < 0.00001){
- x_div = 1.0;
- x_num = 0.0;
- }
- else{
- x_div = x_stretch;
- x_num = 1.0;
- }
-
- if(y_stretch < 0.00001){
- y_div = 1.0;
- y_num = 0.0;
- }
- else{
- y_div = y_stretch;
- y_num = 1.0;
- }
-
- /**************************
- *
- * Loop over image array
- *
- **************************/
-
- printf("\n");
- for(i=0; i<ROWS; i++){
- if( (i%10) == 0) printf("%d ", i);
- for(j=0; j<COLS; j++){
-
- fi = i;
- fj = j;
-
- tmpx = (double)(j)*cosa +
- (double)(i)*sina +
- (double)(x_displace) +
- (double)(x_num*fj/x_div) +
- (double)(x_cross*i*j);
-
- tmpy = (double)(i)*cosa -
- (double)(j)*sina +
- (double)(y_displace) +
- (double)(y_num*fi/y_div) +
- (double)(y_cross*i*j);
-
- if(x_stretch != 0.0)
- tmpx = tmpx - (double)(fj*cosa + fi*sina);
- if(y_stretch != 0.0)
- tmpy = tmpy - (double)(fi*cosa - fj*sina);
-
- new_j = tmpx;
- new_i = tmpy;
-
- if(bilinear == 0){
- if(new_j < 0 ||
- new_j >= COLS ||
- new_i < 0 ||
- new_i >= ROWS)
- out_image[i][j] = FILL;
- else
- out_image[i][j] =
- the_image[new_i][new_j];
- } /* ends if bilinear */
- else{
- out_image[i][j] =
- bilinear_interpolate(the_image,
- tmpx, tmpy);
- } /* ends bilinear if */
-
- } /* ends loop over j */
- } /* ends loop over i */
-
- write_array_into_tiff_image(out_name, out_image,
- il, ie, ll, le);
-
- } /* ends geometry */
-